import pandas as pd 
import numpy as np
import random



# 2021-6-24
print('*'*30 + '2021-6-24' + '*'*100)
print()
#用numpy创建数组
#第一种
t1 = np.array([1,2,3,4])
print(t1)    #[1 2 3 4]
print(type(t1))  #numpy.ndarray

#第二种
t2 = np.array(range(10))
t2_1 = np.array(range(4,10,2))
print(t2)  #[0 1 2 3 4 5 6 7 8 9]
print(t2_1)  #[4 6 8]
print(type(t1))  #numpy.ndarray

#第三种
t3 = np.arange(10)
t3_1 = np.arange(4,10,2)
print(t3)  #[0 1 2 3 4 5 6 7 8 9]
print(t3_1)  #[4 6 8]
print(type(t1))  #numpy.ndarray

#dtype属性返回的是当前数组里面所存放数据的类型
print(t1.dtype)   #int32

#指定数据类型
t4 = np.array([1,2,3,4,5],dtype='int64')
print(t4)   #[1 2 3 4 5]
print(t4.dtype)   #int64
t4_1 = [1,0,1,0,1,1,1,0]
t4_2 = np.array(t4_1,dtype=bool)
print(t4_2)   #[ True False  True False  True  True  True False]
print(t4_2.dtype)   #bool

#调整数据类型
t5 = t4_2.astype(np.int64)
print(t5)    #[1 0 1 0 1 1 1 0]


# 保留小数位  np.round()
t6 = np.array([random.random() for x in range(5)])
print(t6)   #[0.4879028  0.62413023 0.49720885 0.39166719 0.15358393]
print(np.round(t6,2))   #[0.49 0.62 0.5  0.39 0.15]


# shape 和reshape()
t7 = np.array(range(12))
t7_1 = t7.reshape((2,6))
print(t7)   #[ 0  1  2  3  4  5  6  7  8  9 10 11]
print(t7.shape)   #(12,)
print(t7_1)   #[[ 0  1  2  3  4  5][ 6  7  8  9 10 11]]
print(t7_1.shape)   #(2, 6)

# 多维数组转化为一维数组
t8 = t7_1.reshape((t7_1.shape[0]*t7_1.shape[1],))
t9 = t7_1.flatten()
print(t8)    #[ 0  1  2  3  4  5  6  7  8  9 10 11]
print(t9)    #[ 0  1  2  3  4  5  6  7  8  9 10 11]




#数组的计算
t10 = [[1,2,3],
       [4,5,6],
       [7,8,9]]
# t10_2 = t10
t10_1 = np.array(t10)
t10_2 = t10_1
print(t10_1*t10_2)
'''
输出：
[[ 1  4  9]
 [16 25 36]
 [49 64 81]]  
 结果为对应相乘
'''

# 广播原则
t10_3 = np.array([1,2,3])
print(t10+t10_3)
'''
输出：
[[ 2  4  6]
 [ 5  7  9]
 [ 8 10 12]]
'''
t10_4 = np.array([1,2,3]).reshape(3,1)
print(t10_4+t10)
'''
输出：
[[ 2  3  4]
 [ 6  7  8]
 [10 11 12]]
'''


# 2021-6-25
print('*'*30 + '2021-6-24' + '*'*100)
print()
'''
轴：在numpy中可以理解为方向，使用0，1，2...数字表示，
对于一个一维数组，只有0轴，对于二维数组(shape(2,2)),有0轴和1轴
对于三维数组(shape(1,2,3))，有0，1，2轴
'''
# numpy中的转置: transpose()   T   swapaxes(1,0）
t11 = np.array(range(24)).reshape((4,6))
print(type(t11))
'''
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
'''
print(t11.transpose())
'''
[[ 0  6 12 18]
 [ 1  7 13 19]
 [ 2  8 14 20]
 [ 3  9 15 21]
 [ 4 10 16 22]
 [ 5 11 17 23]]
'''
print(t11.T)   #转置
'''
[[ 0  6 12 18]
 [ 1  7 13 19]
 [ 2  8 14 20]
 [ 3  9 15 21]
 [ 4 10 16 22]
 [ 5 11 17 23]]
'''
print(t11.swapaxes(1,0))   #交换轴
'''
[[ 0  6 12 18]
 [ 1  7 13 19]
 [ 2  8 14 20]
 [ 3  9 15 21]
 [ 4 10 16 22]
 [ 5 11 17 23]]
'''
# numpy的索引和切片
t12 = np.array(range(48)).reshape((6,8))
print(t12)
'''
[[ 0  1  2  3  4  5  6  7]
 [ 8  9 10 11 12 13 14 15]
 [16 17 18 19 20 21 22 23]
 [24 25 26 27 28 29 30 31]
 [32 33 34 35 36 37 38 39]
 [40 41 42 43 44 45 46 47]]
'''
# t12[3,3] = np.nan
print()
# 取某一行
# print(t12[1]) #代表第二行
# 取某几行
# print(t12[[0,1]])  #代表第一行和第二行
# 取连续几行
# print(t12[0:3])  #代表第一行到第三行
# 取列
# print(t12[:,1])   #代表二列
# 取连续的几行几列
# print(t12[0:2,0:3])  #代表第一行第二行与第一列第二列第三列的交集点
# 取不连续的点
# print(t12[[0,2,4],[0,2,1]])  #取得点(0,0),(2,2),(4,1)

# 修改元素的值
# t12[[1,3,5]] = 0
# print(t12)
'''
[[ 0  1  2  3  4  5  6  7]
 [ 0  0  0  0  0  0  0  0]
 [16 17 18 19 20 21 22 23]
 [ 0  0  0  0  0  0  0  0]
 [32 33 34 35 36 37 38 39]
 [ 0  0  0  0  0  0  0  0]]
'''
# numpy中的bool索引
# print(t12<5)
'''
[[ True  True  True  True  True False False False]
 [False False False False False False False False]
 [False False False False False False False False]
 [False False False False False False False False]
 [False False False False False False False False]
 [False False False False False False False False]]
'''
# 下面是常用的
# t12[t12<5] = 3
# print(t12)
'''
[[ 3  3  3  3  3  5  6  7]
 [ 8  9 10 11 12 13 14 15]
 [16 17 18 19 20 21 22 23]
 [24 25 26 27 28 29 30 31]
 [32 33 34 35 36 37 38 39]
 [40 41 42 43 44 45 46 47]]
'''
# numpy里面的三木运算符
# a = 4 if 2<3 else 5  #python里面的三木运算符，a输出为4
# a= 4 if 2>3 else 5  #a输出为5
# #np.where(t12<5,3,10),在t12中小于5的替换成3，其余替换成10,返回修改后的ndarray
# print(np.where(t12<5,3,10))
'''
[[ 3  3  3  3  3 10 10 10]
 [10 10 10 10 10 10 10 10]
 [10 10 10 10 10 10 10 10]
 [10 10 10 10 10 10 10 10]
 [10 10 10 10 10 10 10 10]
 [10 10 10 10 10 10 10 10]]
'''
# t12.clip(10,18),小于10的改为10，大于18的改为18，返回修改后的t12
# print(t12.clip(10,18))
'''
[[10 10 10 10 10 10 10 10]
 [10 10 10 11 12 13 14 15]
 [16 17 18 18 18 18 18 18]
 [18 18 18 18 18 18 18 18]
 [18 18 18 18 18 18 18 18]
 [18 18 18 18 18 18 18 18]]
'''
# 数组的拼接
# np.vstack(t1,t2) #竖直拼接，t1在上，t2在下，返回新的数组
# np.hstack(t1,t2)   #水平拼接，t1在左边，t2在右边

# 交换数组的行列
# t12[[1,2],:] = t12[[2,1],:]   #交换第2行和第3行
# t12[:,[0,2]] = t12[:,[2,0]]  #交换第一列和第三列

'''
np.nan和np.inf类型都为浮点型
nan(nan,NAN):not a number
什么时候numpy里面会出现nan：
   读取本地文件为float时，如果有缺失，就会出现nan；
   当做了一个不合适的计算时（无穷大（inf）-无穷大）
什么时候会出现inf（包括inf和-inf）：
   比如一个数除以0（python中会直接报错，numpy中是inf或者-inf
nan和任何值计算都是nan
'''
# 两个nan是不相等的，利用此特性可以判断出一个数组中nan的个数
# print(np.nan == np.nan)  #False
# # np.count_nonzero(数组) ：统计数组中非0的个数
# print(np.count_nonzero(t12!=t12))  #0
# #np.isnan(数组)：返回数组中的元素是否为nan
# print(np.count_nonzero(np.isnan(t12)))  #0

'''
numpy中常用的统计函数：

'''

'''
要注意numpy里的深拷贝和浅拷贝
 浅拷贝：b = a,是把b指向的地址赋给了b
 深拷贝：是把内容复制给另一个变量
'''
# numpy里面的copy和view
# a=b 不完全复制，a,b相互影响，浅拷贝
# a=b[:],视图的操作，一种切片，会创建一个新的对象a，但a的数据完全由b保管
# a=b.copy(),深拷贝，a和b互不影响

# b1 = t12[:]
# t12[0,1] = 99
# print(b1) b1的（0,1）位置变成了99



# 下面的方法是把nan替换成每行的平均值
# t12 = t12.astype('float')
# t12[3,[3,4]] = np.nan
# print(t12)
# for i in range(t12.shape[0]):
#        row = t12[i]
#        if np.count_nonzero(row!=row)!=0:
#               row_not_nan = row[row==row]
#               row[np.isnan(row)] = row_not_nan.mean()
#               pass
#        pass
# print(t12)

'''
创建一个全为0的数组：np.zeros((3,4))
创建一个全为1的数组：np.ones((3,4))
创建一个对角线全为1的数组（方阵）：np.eye(3)
获取最大最小值的位置：
   np.argmax(t,axis=o)  表示行方向，即每列
   np.argmin(t,axis=1)  表示列方向，即每行
'''
# print(np.zeros((3,4)))
'''
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
'''
# print(np.ones((3,4)))
'''
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]
'''
# print(np.eye(3))
'''
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
'''
# print(np.argmax(t12,axis=0))   #[5 5 5 5 5 5 5 5]
# print(np.argmax(t12,axis=1))   #[7 7 7 7 7 7]



'''
np.random里面的方法：
  numpy.random.randn(d0, d1, …, dn)是从标准正态分布中返回一个或多个样本值。 
  numpy.random.rand(d0, d1, …, dn)的随机样本位于[0, 1)中。 
  np.random.randint(low,high,size)函数的作用是，返回一个随机整型数，范围从低（包括）到高（不包括），即[low, high)。
如果没有写参数high的值，则返回[0,low)的值。
  np.random,uniform(low,high,size)产生具有均匀分布的数组。
  np.random.normal(loc,scale,size)从指定的正态分布中随机抽取样本，期望E是loc，标准差是scale，size是形状
  np.random.seed(s)随机数种子，s是给定的种子值，使每次生成相同的随机数
'''
# np.random.seed(10)
# print(np.random.normal(2 ,6 ,(2 ,4))) #每次编译出来的都是一样的

'''

'''
